/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vista;

import controladores.DetallenominaJpaController;
import controladores.EmpleadoJpaController;
import controladores.NominaJpaController;
import controladores.ParametrosJpaController;
import java.awt.Frame;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.InputMap;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.table.DefaultTableModel;
import modelo.Detallenomina;
import modelo.Empleado;
import modelo.Incapacidad;
import modelo.Nomina;
import modelo.Parametros;

/**
 *
 * @author Ususario
 */
public class GestionNomina extends javax.swing.JInternalFrame {

    List<String> nominas = new ArrayList<String>();
    private DefaultTableModel modelo1;
    String datos1[][] = {};
    String columnas1[] = {"Nombre", "Año", "Mes", "Quincena"};
    boolean nuevo = false;
    NominaJpaController nC = new NominaJpaController();
    DecimalFormat df = new DecimalFormat();
    EmpleadoJpaController emplC = new EmpleadoJpaController();
    Parametros pg = new ParametrosJpaController().findParametros(1);

    public GestionNomina() {
        modelo1 = new DefaultTableModel(datos1, columnas1);
        initComponents();
        List<Nomina> nominas = nC.findNominaEntities();
        for (int i = 0; i < nominas.size(); i++) {
            Nomina b = nominas.get(i);
            modelo1.addRow(new Object[]{});
            modelo1.setValueAt(b.getNombre(), i, 0);
            modelo1.setValueAt(b.getAnio(), i, 1);
            modelo1.setValueAt(mesField.getItemAt(b.getMes() - 1).toString(), i, 2);
            modelo1.setValueAt(b.getQuincena(), i, 3);
        }
        masterTable.setModel(modelo1);
        InputMap im = masterTable.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        im.put(KeyStroke.getKeyStroke("DOWN"), "none");
        im.put(KeyStroke.getKeyStroke("UP"), "none");


    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        anioField = new javax.swing.JTextField();
        quincenaLabel = new javax.swing.JLabel();
        mesLabel = new javax.swing.JLabel();
        anioLabel = new javax.swing.JLabel();
        deleteButton = new javax.swing.JButton();
        newButton = new javax.swing.JButton();
        refreshButton = new javax.swing.JButton();
        saveButton = new javax.swing.JButton();
        masterScrollPane = new javax.swing.JScrollPane();
        masterTable = new javax.swing.JTable();
        mesField = new javax.swing.JComboBox();
        quincenaField = new javax.swing.JComboBox();
        jButton1 = new javax.swing.JButton();

        setTitle("Gestionar Nomina");
        setPreferredSize(new java.awt.Dimension(885, 440));

        anioField.setEnabled(false);

        quincenaLabel.setText("Quincena:");

        mesLabel.setText("Mes:");

        anioLabel.setText("Año:");

        deleteButton.setText("Borrar");
        deleteButton.setEnabled(false);
        deleteButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                deleteButtonActionPerformed(evt);
            }
        });

        newButton.setText("Nueva");
        newButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                newButtonActionPerformed(evt);
            }
        });

        refreshButton.setText("Refrescar");
        refreshButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                refreshButtonActionPerformed(evt);
            }
        });

        saveButton.setText("Guardar");
        saveButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                saveButtonActionPerformed(evt);
            }
        });

        masterTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Nombre", "Año", "Mes", "Quincena"
            }
        ));
        masterScrollPane.setViewportView(masterTable);

        mesField.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" }));
        mesField.setEnabled(false);

        quincenaField.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "1", "2" }));
        quincenaField.setEnabled(false);

        jButton1.setText("Detalle");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addComponent(jButton1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(newButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(deleteButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(refreshButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(saveButton))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(anioLabel)
                            .addComponent(mesLabel)
                            .addComponent(quincenaLabel))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(anioField, javax.swing.GroupLayout.DEFAULT_SIZE, 796, Short.MAX_VALUE)
                            .addComponent(mesField, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(quincenaField, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                    .addComponent(masterScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 849, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(masterScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE)
                .addGap(28, 28, 28)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(anioLabel)
                    .addComponent(anioField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(mesLabel)
                    .addComponent(mesField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(quincenaLabel)
                    .addComponent(quincenaField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(saveButton)
                    .addComponent(refreshButton)
                    .addComponent(deleteButton)
                    .addComponent(newButton)
                    .addComponent(jButton1))
                .addGap(41, 41, 41))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteButtonActionPerformed
    }//GEN-LAST:event_deleteButtonActionPerformed

    private void newButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newButtonActionPerformed
        masterTable.clearSelection();
        anioField.setText("");
        anioField.setEnabled(true);
        mesField.setEnabled(true);
        quincenaField.setEnabled(true);
        nuevo = true;
    }//GEN-LAST:event_newButtonActionPerformed

    private void refreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshButtonActionPerformed
    }//GEN-LAST:event_refreshButtonActionPerformed
    public static boolean isNumeric(String cadena) {
        try {
            Float.parseFloat(cadena);
            return true;
        } catch (NumberFormatException nfe) {
            return false;
        }
    }
    private void saveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveButtonActionPerformed
        try {
            if (anioField.getText().trim().equals("") || !this.isNumeric(anioField.getText().trim())) {
                JOptionPane.showMessageDialog(null, "Por favor llene todos los campos");
            } else {
                if (!nuevo) {
                    List<Nomina> nominas = nC.findNominaEntities();
                    Nomina seleccionado = nominas.get(masterTable.getSelectedRow());
                    seleccionado.setAnio(Integer.parseInt(anioField.getText().trim()));
                    seleccionado.setMes(mesField.getSelectedIndex() + 1);
                    seleccionado.setQuincena(quincenaField.getSelectedIndex() + 1);
                    String nombre = "Nomina";
                    if (quincenaField.getSelectedIndex() == 0) {
                        nombre += " primera quincena de " + mesField.getSelectedItem().toString() + " de " + anioField.getText().trim();
                    } else {
                        nombre += " segunda quincena de " + mesField.getSelectedItem().toString() + " de " + anioField.getText().trim();
                    }

                    seleccionado.setNombre(nombre);
                    nC.edit(seleccionado);
                    List<Nomina> nomins = nC.findNominaEntities();
                    modelo1 = new DefaultTableModel(datos1, columnas1);
                    for (int i = 0; i < nomins.size(); i++) {
                        Nomina aux = nomins.get(i);
                        modelo1.addRow(new Object[]{});
                        modelo1.setValueAt(aux.getNombre(), i, 0);
                        modelo1.setValueAt(aux.getAnio(), i, 1);
                        modelo1.setValueAt(aux.getMes(), i, 2);
                        modelo1.setValueAt(aux.getQuincena(), i, 3);
                    }
                    masterTable.setModel(modelo1);
                    anioField.setText("");
                    anioField.setEnabled(false);
                    mesField.setEnabled(false);
                    quincenaField.setEnabled(false);

                } else {
                    Nomina nuevaN = new Nomina();
                    nuevaN.setAnio(Integer.parseInt(anioField.getText().trim()));
                    nuevaN.setMes(mesField.getSelectedIndex() + 1);
                    nuevaN.setQuincena(quincenaField.getSelectedIndex() + 1);
                    String nombre = "Nomina";
                    if (quincenaField.getSelectedIndex() == 0) {
                        nombre += " primera quincena de " + mesField.getSelectedItem().toString() + " de " + anioField.getText().trim();
                    } else {
                        nombre += " segunda quincena de " + mesField.getSelectedItem().toString() + " de " + anioField.getText().trim();
                    }

                    nuevaN.setNombre(nombre);
                    nC.create(nuevaN);
                    modelo1.addRow(new Object[]{});
                    modelo1.setValueAt(nuevaN.getNombre(), masterTable.getRowCount() - 1, 0);
                    modelo1.setValueAt(nuevaN.getAnio(), masterTable.getRowCount() - 1, 1);
                    modelo1.setValueAt(mesField.getItemAt(nuevaN.getMes() - 1).toString(), masterTable.getRowCount() - 1, 2);
                    modelo1.setValueAt(nuevaN.getQuincena(), masterTable.getRowCount() - 1, 3);
                    masterTable.setModel(modelo1);
                    anioField.setText("");
                    anioField.setEnabled(false);
                    mesField.setEnabled(false);
                    quincenaField.setEnabled(false);

                    Nomina recienCreada = nC.findByUltimo();
                    int anio = recienCreada.getAnio();
                    int mes = recienCreada.getMes();
                    String diaFinal;
                    String diaInicial;
                    int quincena = recienCreada.getQuincena();
                    if (quincena == 1) {
                        diaInicial = "01";
                        diaFinal = "15";
                    } else {
                        diaInicial = "16";
                        diaFinal = "31";
                        if (mes == 4 || mes == 6 || mes == 9 || mes == 11) {
                            diaFinal = "30";
                        } else {
                            if (mes == 2) {
                                if (anio % 4 == 0) {
                                    diaFinal = "29";
                                } else {
                                    diaFinal = "28";
                                }
                            }
                        }


                    }
                    String mes2 = "" + mes;
                    if (mes < 10) {
                        mes2 = "0" + mes;
                    }
                    String fechaInicialQuincena = "" + diaInicial + "-" + mes2 + "-" + anio;
                    String fechaFinalQuincena = "" + diaFinal + "-" + mes2 + "-" + anio;
                    SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd-MM-yyyy");
                    Date fechaInicialQ = null;
                    Date fechaFinalQ = null;
                    try {

                        fechaInicialQ = formatoDelTexto.parse(fechaInicialQuincena);
                        fechaFinalQ = formatoDelTexto.parse(fechaFinalQuincena);

                    } catch (ParseException ex) {
                        ex.printStackTrace();
                    }

                    List<Empleado> empleados = emplC.findEmpleadoEntities();
                    DetallenominaJpaController dnC = new DetallenominaJpaController();
                    final long MILLSECS_PER_DAY = 24 * 60 * 60 * 1000; //Milisegundos al día 
                    for (Empleado empleado : empleados) {
                        Detallenomina dn = new Detallenomina();
                        dn.setNominaIdnomina(recienCreada);
                        dn.setEmpleadoIdempleado(empleado);
                        dn.setDiasincapacidad(0);
                        dn.setDiastrabajados(0);
                        dn.setAuxTransporte(new Float("0.0"));
                        dn.setSubAlimenticio(new Float("0.0"));
                        dn.setSueldomes(new Float("0.0"));
                        dn.setIncapacidadLicencia(new Float("0.0"));
                        List<Incapacidad> incapacidades = empleado.getIncapacidadList();
                        for (Incapacidad incapacidad : incapacidades) {
                            if (incapacidad.getFechafinal().compareTo(fechaInicialQ) >= 0) {
                                if (incapacidad.getFechainicio().compareTo(fechaFinalQ) <= 0) {
                                    if (incapacidad.getFechainicio().compareTo(fechaInicialQ) < 0
                                            && incapacidad.getFechafinal().compareTo(fechaFinalQ) > 0) { // si la incapacidad contiene a la quincena

                                        long diferencia = (fechaInicialQ.getTime() - incapacidad.getFechainicio().getTime()) / MILLSECS_PER_DAY;
                                        if (diferencia >= 2) {
                                            dn.setDiasincapacidad(15);
                                            dn.setIncapacidadLicencia(empleado.getSalario() / 3);
                                        } else {
                                            dn.setDiasincapacidad(15);
                                            float pagadosCompletos = (empleado.getSalario() / 30) * (3 - diferencia + 1);
                                            float pagadosDosTercios = (empleado.getSalario() / 45) * (15 - (3 - diferencia + 1));
                                            dn.setIncapacidadLicencia(pagadosCompletos + pagadosDosTercios);

                                        }

                                    } else {
                                        if (incapacidad.getFechainicio().compareTo(fechaInicialQ) < 0
                                                && incapacidad.getFechafinal().compareTo(fechaFinalQ) <= 0) { // si la incapacidad contiene a la quincena por la izquierda
                                            long diferencia = (fechaInicialQ.getTime() - incapacidad.getFechainicio().getTime()) / MILLSECS_PER_DAY;
                                            long diferencia2 = (fechaFinalQ.getTime() - incapacidad.getFechafinal().getTime()) / MILLSECS_PER_DAY;

                                            if (diferencia >= 3) {
                                                long diasInca = 15 - diferencia2 + 1;
                                                dn.setDiasincapacidad((int) diasInca);
                                                dn.setIncapacidadLicencia((empleado.getSalario() / 45) * (diasInca));
                                            } else {
                                                long diasInca = 15 - diferencia2 + 1;
                                                dn.setDiasincapacidad((int) diasInca);
                                                float pagadosCompletos = (empleado.getSalario() / 30) * (3 - diferencia);
                                                float pagadosDosTercios = (empleado.getSalario() / 45) * (diasInca - (3 - diferencia));
                                                dn.setIncapacidadLicencia(pagadosCompletos + pagadosDosTercios);

                                            }


                                        } else {
                                            if (incapacidad.getFechainicio().compareTo(fechaInicialQ) >= 0
                                                    && incapacidad.getFechafinal().compareTo(fechaFinalQ) > 0) {// si la incapacidad contiene a la quincena por la derecha
                                                long diferencia = (fechaFinalQ.getTime() - incapacidad.getFechainicio().getTime()) / MILLSECS_PER_DAY;

                                                if (diferencia >= 2) {
                                                    long diasInca = diferencia + 1;
                                                    dn.setDiasincapacidad((int) diasInca);
                                                    float pagadosCompletos = (empleado.getSalario() / 30) * (3);
                                                    float pagadosDosTercios = (empleado.getSalario() / 45) * (diferencia + 1 - 3);
                                                    dn.setIncapacidadLicencia(pagadosCompletos + pagadosDosTercios);
                                                } else {
                                                    long diasInca = diferencia + 1;
                                                    dn.setDiasincapacidad((int) diasInca);
                                                    dn.setIncapacidadLicencia((empleado.getSalario() / 30) * (diasInca));
                                                }

                                            } else {
                                                if (incapacidad.getFechainicio().compareTo(fechaInicialQ) >= 0
                                                        && incapacidad.getFechafinal().compareTo(fechaFinalQ) <= 0) {//si la incapacidad esta contenida en la quincena
                                                    long diferencia = (incapacidad.getFechafinal().getTime() - incapacidad.getFechainicio().getTime()) / MILLSECS_PER_DAY;

                                                    if (diferencia >= 2) {
                                                        long diasInca = diferencia + 1;
                                                        dn.setDiasincapacidad((int) diasInca);
                                                        float pagadosCompletos = (empleado.getSalario() / 30) * (3);
                                                        float pagadosDosTercios = (empleado.getSalario() / 45) * (diferencia + 1 - 3);
                                                        dn.setIncapacidadLicencia(pagadosCompletos + pagadosDosTercios);
                                                    } else {
                                                        long diasInca = diferencia + 1;
                                                        dn.setDiasincapacidad((int) diasInca);
                                                        dn.setIncapacidadLicencia((empleado.getSalario() / 30) * (diasInca));
                                                    }

                                                }
                                            }
                                        }

                                    }
                                }
                            }
                        }
                        dn.setTotaldevengado(dn.getIncapacidadLicencia());
                        float salu = (dn.getTotaldevengado() - dn.getAuxTransporte() - dn.getSubAlimenticio()) * pg.getPorcentajesalud() / 100;
                        float pensio = (dn.getTotaldevengado() - dn.getAuxTransporte() - dn.getSubAlimenticio()) * pg.getPorcentajepension() / 100;
                        float fps = (dn.getSueldomes() > (pg.getSalariominimo() * 4) ? (float) ((dn.getTotaldevengado() - dn.getAuxTransporte()) * 0.01) :(float) 0.0);
                        float rete = (float) 0.0;
                        dn.setSalud(salu);
                        dn.setPension(pensio);
                        dn.setFsp(fps);
                        dn.setRetefuente(rete);
                        dnC.create(dn);


                    }


                }




            }

        } catch (Exception rex) {
            /*rex.printStackTrace();
             entityManager.getTransaction().begin();
             List<vista.Banco> merged = new ArrayList<vista.Banco>(list.size());
             for (vista.Banco b : list) {
             merged.add(entityManager.merge(b));
             }
             list.clear();
             list.addAll(merged);*/
        }
    }//GEN-LAST:event_saveButtonActionPerformed

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        List<Nomina> nominas = nC.findNominaEntities();
        Nomina seleccionada = nominas.get(masterTable.getSelectedRow());
        Frame f = JOptionPane.getFrameForComponent(this);
        DialogNomina dialog = new DialogNomina(f, true, seleccionada);
        dialog.show();
        // new DialogNomina(super, false);


    }//GEN-LAST:event_jButton1ActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTextField anioField;
    private javax.swing.JLabel anioLabel;
    private javax.swing.JButton deleteButton;
    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane masterScrollPane;
    private javax.swing.JTable masterTable;
    private javax.swing.JComboBox mesField;
    private javax.swing.JLabel mesLabel;
    private javax.swing.JButton newButton;
    private javax.swing.JComboBox quincenaField;
    private javax.swing.JLabel quincenaLabel;
    private javax.swing.JButton refreshButton;
    private javax.swing.JButton saveButton;
    // End of variables declaration//GEN-END:variables
}
